<?php
// +----------------------------------------------------------------------
// | Exquisite
// +----------------------------------------------------------------------
// | Author: derek <693472824@qq.com> <http://www.bloveambition.com/>
// +----------------------------------------------------------------------

/**
 * 系统公共库文件
 * 主要定义系统公共函数库
 */

/**
 * 身份证号码验证
 */
function checkIdCard ($idcard) {

    if (empty($idcard)) {
        return false;
    }
    
    $City = array(
            11 => "北京",
            12 => "天津",
            13 => "河北",
            14 => "山西",
            15 => "内蒙古",
            21 => "辽宁",
            22 => "吉林",
            23 => "黑龙江",
            31 => "上海",
            32 => "江苏",
            33 => "浙江",
            34 => "安徽",
            35 => "福建",
            36 => "江西",
            37 => "山东",
            41 => "河南",
            42 => "湖北",
            43 => "湖南",
            44 => "广东",
            45 => "广西",
            46 => "海南",
            50 => "重庆",
            51 => "四川",
            52 => "贵州",
            53 => "云南",
            54 => "西藏",
            61 => "陕西",
            62 => "甘肃",
            63 => "青海",
            64 => "宁夏",
            65 => "新疆",
            71 => "台湾",
            81 => "香港",
            82 => "澳门",
            91 => "国外"
    );
    
    $iSum = 0;
    $idCardLength = strlen($idcard);
    
    // 长度验证
    if (! preg_match('/^\d{17}(\d|x)$/i', $idcard) and
             ! preg_match('/^\d{15}$/i', $idcard)) {
        
        return false;
    }
    
    // 地区验证
    if (! array_key_exists(intval(substr($idcard, 0, 2)), $City)) {
        
        return false;
    }
    
    // 15位身份证验证生日，转换为18位
    if ($idCardLength == 15) {
        
        $sBirthday = '19' . substr($idcard, 6, 2) . '-' . substr($idcard, 8, 2) .
                 '-' . substr($idcard, 10, 2);
        $d = new DateTime($sBirthday);
        $dd = $d->format('Y-m-d');
        
        if ($sBirthday != $dd) {
            
            return false;
        }
        $idcard = substr($idcard, 0, 6) . "19" . substr($idcard, 6, 9); // 15to18
        $Bit18 = getVerifyBit($idcard); // 算出第18位校验码
        $idcard = $idcard . $Bit18;
    }
    
    // 判断是否大于2078年，小于1900年
    $year = substr($idcard, 6, 4);
    if ($year < 1900 || $year > 2078) {
        return false;
    }
    
    // 18位身份证处理
    $sBirthday = substr($idcard, 6, 4) . '-' . substr($idcard, 10, 2) . '-' .
             substr($idcard, 12, 2);
    $temp = GetMkTime($sBirthday);
    $temp = GetDateMk($temp);
    
    if ($sBirthday != $temp) {
        return false;
    }
    
    // 身份证编码规范验证
    $idcard_base = substr($idcard, 0, 17);
    
    if (strtoupper(substr($idcard, 17, 1)) != getVerifyBit($idcard_base)) {
        return false;
    } else {
        return true;
    }
}

// 计算身份证校验码，根据国家标准GB 11643-1999
function getVerifyBit ($idcard_base) {

    if (strlen($idcard_base) != 17) {
        return false;
    }
    // 加权因子
    $factor = array(
            7,
            9,
            10,
            5,
            8,
            4,
            2,
            1,
            6,
            3,
            7,
            9,
            10,
            5,
            8,
            4,
            2
    );
    // 校验码对应值
    $verify_number_list = array(
            '1',
            '0',
            'X',
            '9',
            '8',
            '7',
            '6',
            '5',
            '4',
            '3',
            '2'
    );
    
    $checksum = 0;
    
    for ($i = 0; $i < strlen($idcard_base); $i ++) {
        $checksum += substr($idcard_base, $i, 1) * $factor[$i];
    }
    
    $mod = $checksum % 11;
    $verify_number = $verify_number_list[$mod];
    
    return $verify_number;
}

/**
 * 调用接口，并取返回结果
 * 
 * @param string $url
 *            接口地址
 * @param string|array $param
 *            参数
 * @return mixed
 */
function callInterface ($url, $param = '', $json=FALSE, $post = 1) {

    if (! empty($url)) {
        
        $temp = '';
        
        if (is_array($param)) {
            
            if(json){
                
                $temp = json_encode($param);
                
            }else{
                foreach ($param as $key => $val) {
                    
                    if (! empty($temp)) {
                        $temp .= '&';
                    }
                    
                    $temp .= $key . '=' . $val;
                }
            }
        } else {
            
            $temp = $param;
        }
        
        $ch = curl_init();
        
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $temp);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        curl_setopt($ch, CURLOPT_POST, $post); // 启用POST提交
        
        if($json){
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                    'Content-Type: application/json; charset=utf-8',
                    'Content-Length: ' . strlen($temp)
                    )
            );
        }
        
        $result = curl_exec($ch);
        
        curl_close($ch);
    } else {
        
        $result = '';
    }
    
    return $result;
}

/**
 * 打印支付日志
 */
function log_result ($file, $word) {

    $fp = fopen($file, "a");
    flock($fp, LOCK_EX);
    fwrite($fp, "执行日期：" . strftime("%Y-%m-%d-%H：%M：%S", time()) . "\n" . $word .
             "\n\n");
    flock($fp, LOCK_UN);
    fclose($fp);
}

?>